﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using Entidades;
using Web.Extensions;
using Web.Helpers;
using Entidades.jSON;
using Controladores;
using Newtonsoft.Json;
using Common;
using Web.Helpers.jqGridHelpers;

namespace Web.Pages
{
    public partial class _Proyecto : BasePage
    {
        #region Public Members
        public bool _registroInactivo = false;
        #endregion

        #region Events

        protected new void Page_Load(object sender, EventArgs e)
        {
            base.Page_Load(sender, e);

            if (!Page.IsPostBack)
            {
                var idProyecto = Convert.ToInt32(Helpers.WebHelper.Pages.QueryString.GetParameter(Common.WellKnownKeys.Page.Parameters.ID_PROYECTO));
                this.CargarPagina(idProyecto);
            }
        }

        #endregion

        #region Private Methods

        private void CargarPagina(int idProyecto)
        {
            var tiposProyecto = TiposProyecto.ObtenerTodos();
            this.selProyecto_Tipo.Bind(tiposProyecto, "Id", "Texto");

            var estadosGuion = EstadosGuion.ObtenerTodos();
            this.selEstadoGuion.Bind(estadosGuion, "Id", "Texto");

            if ( idProyecto != Common.WellKnownKeys.Entities.DEFAULT_ID )
                this.CargarProyecto(idProyecto);
        }

        private void CargarProyecto(int idProyecto)
        {
            var proyecto = new ControladorBase<Proyecto>().ObtenerEntidad(idProyecto);
            if (proyecto != null)
            {
                this.txtProyecto_Nombre.Value = proyecto.Nombre;
                this.txtProyecto_Descripcion.Value = proyecto.Descripcion;
                this.selProyecto_Tipo.SetSelected(proyecto.Tipo.Id);

                this._registroInactivo = !proyecto.Activo;
            }
        }

        #endregion

        #region Web Methods

        /// <summary>
        /// Obtiene los datos sobre los Guiones asociados al Proyecto
        /// </summary>
        /// <param name="pageSize"></param>
        /// <param name="currentPage"></param>
        /// <param name="sortColumn"></param>
        /// <param name="sortOrder"></param>
        /// <param name="search"></param>
        /// <param name="searchFilter"></param>
        /// <param name="colModel"></param>
        /// <param name="isExport"></param>
        /// <returns></returns>
        [WebMethod]
        public static string obtenerGuiones(int pageSize, int currentPage, string sortColumn, string sortOrder, string search, string searchFilter, string colModel, bool isExport)
        {
            var jSON = string.Empty;
            try
            {
                //var usuarioLogueado = SessionHelper.GetCurrentUser();
                //var idProyecto = (int)Helpers.WebHelper.Session.Get(Common.WellKnownKeys.Page.Parameters.ID_PROYECTO);

                //var parametros = new GridDataHelper().GetParameters(searchFilter);
                //    parametros.Add("id_proyecto", idProyecto);
                //if (!BasePage.ValidarTipoUsuario(WellKnownKeys.Entities.TiposUsuario.ADMINISTRADOR.Nombre))
                //    parametros.Add("id_usuario", usuarioLogueado.Id);

                //var jqGridData = new Grid<Entidades.Calculado.GuionResumen>().GetGridData(WellKnownKeys.StoredProcedures.Proyecto_Guiones_GET, parametros, currentPage, pageSize, BuildDataRows);
                var jqGridData = new Grid<Guion>().GetGridData(searchFilter, colModel, currentPage, pageSize, sortOrder, sortColumn, BuildDataRows);

                jSON = Formatter.JSON<jqGridData>.Serialize(jqGridData);
            }
            catch (Exception ex)
            {
                LogError(ex);
                throw;
                //string detalleError = ex.Message;
                //jSON = Formatter.jSON.convertirEnJSON(new Helpers.jqGridHelpers.jqGridData(0, 0, 1, null));
            }
            return jSON;
        }

        //public static IEnumerable<object[]> BuildDataRows(IList<Entidades.Calculado.GuionResumen> data)
        //{
        //    IEnumerable<object[]> lista = from Entidades.Calculado.GuionResumen item in data
        //                                  select new object[]
        //                                      {
        //                                          item.Id,
        //                                          item.Episodio,
        //                                          BasePage.CrearLink(WellKnownKeys.Grid.Actions.VER + "Guion", item.Id, Formatter.Text.ReducirTexto(item.Titulo, 40)),
        //                                          item.Loops,
        //                                          item.FechaCreacion,
        //                                          item.Estado
        //                                      };
        //    return lista;
        //}
        public static IEnumerable<object[]> BuildDataRows(IList<Guion> data)
        {
            var lista = from Guion item in data
                        select new object[]
                            {
                                item.Proyecto.Id,
                                item.Id,
                                item.Activo,
                                item.Adaptador.IsNotNull() ? item.Adaptador.Id : WellKnownKeys.Entities.DEFAULT_ID,
                                item.Director.IsNotNull() ? item.Director.Id : WellKnownKeys.Entities.DEFAULT_ID,
                                item.Mezclador.IsNotNull() ? item.Mezclador.Id : WellKnownKeys.Entities.DEFAULT_ID,
                                item.Traductor.IsNotNull() ? item.Traductor.Id : WellKnownKeys.Entities.DEFAULT_ID,
                                item.Episodio,
                                BasePage.CrearLink(WellKnownKeys.Grid.Actions.VER + "Guion", item.Id, Formatter.Text.ReducirTexto(item.Titulo, 40)),
                                item.Loops,
                                item.FechaCreacion,
                                item.Estado.Nombre
                            };
            return lista;
        }

        /// <summary>
        /// Guarda un Proyecto
        /// </summary>
        /// <param name="infoProyecto"></param>
        /// <returns></returns>
        [WebMethod]
        public static string guardarProyecto(string infoProyecto)
        {
            var mensaje     = "Hubo un error al intentar guardar los datos del Proyecto.";
            var resultado   = false;
            object valor    = null;
            try
            {
                var controlador = new ControladorBase<Proyecto>();

                var proyectoInfo = JsonConvert.DeserializeObject<ProyectoInfo>(infoProyecto);

                #region Proyecto
                var proyecto = controlador.ObtenerEntidad(proyectoInfo.Id);
                if (proyecto.IsNull())
                    proyecto                = new Proyecto();
                    proyecto.Tipo           = new ControladorBase<ProyectoTipo>().ObtenerEntidad(proyectoInfo.IdTipo);
                    proyecto.Nombre         = proyectoInfo.Nombre;
                    proyecto.Descripcion    = proyectoInfo.Descripcion;
                    proyecto.Activo         = true;
                #endregion

                #region Auditoria Proyecto
                var fechaActual = DateTime.Now;
                var usuarioActual = SessionHelper.GetCurrentUser();
                var usuario = new ControladorBase<Usuario>().ObtenerEntidad(usuarioActual.Id);
                if ( proyecto.FechaCreacion == null || proyecto.FechaCreacion.Equals(DateTime.MinValue) )
                {
                    proyecto.UsuarioCreacion = usuario;
                    proyecto.FechaCreacion = fechaActual;
                }

                #endregion

                resultado = Proyectos.GuardarProyecto(controlador, proyecto);
                if (resultado)
                {
                    mensaje = "Los datos del Proyecto fueron guardados exitosamente.";
                    valor   = new ProyectoInfo(proyecto);
                }
            }
            catch (Exception ex)
            {
                LogError(ex);
                mensaje = "Hubo un error al intentar guardar los datos del Proyecto." + Environment.NewLine + ex.Message;
            }
            return SessionHelper.BuildResponse(mensaje, resultado, valor);
        }

        #endregion
    }
}